package br.ucb.tcc.swing;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.event.ListSelectionEvent;

import net.java.dev.designgridlayout.DesignGridLayout;
import thinlet.swing.border.LineBorder;
import thinlet.swing.container.ToolFooter;
import thinlet.swing.table.Cell;
import thinlet.swing.table.Table;
import twitter4j.Tweet;
import twitter4j.TwitterException;
import twitter4j.User;
import br.ucb.tcc.entidades.Perfil;
import br.ucb.tcc.entidades.Relacionamento;
import br.ucb.tcc.negocio.TwitterBean;
import br.ucb.tcc.persistencia.TwitterDAO;
import br.ucb.tcc.utils.StringUtil;

public class BuscarUsuarioPorArgumentoPanel extends AbstractPanel implements Table.Listener<Perfil>, ActionListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JScrollPane scrollPane;
	private ToolFooter subPanelHeader;
	private JTextField campoPesquisa;
	private JButton pesquisarButton;
	private JButton limparPesquisaButton;
	private JButton salvarUsuarioButton;
	private JButton salvarRelacoesButton;
	private JComboBox filtrarPesquisa;
	private JPanel acoesPanel;
	private Table<Perfil> lista;
	private List<Perfil> perfilDTOs;
	private List<Tweet> usuariosPesquisados;
	private TwitterDAO perfilDAO = new TwitterDAO();

	/**
	 * 
	 */
	public BuscarUsuarioPorArgumentoPanel() {
		super(new BorderLayout());
		subPanelHeader = new ToolFooter();
		JLabel lbHeader = new JLabel("<html><body>" + "<table><tr><td>" + "<img width='650' height='100' src='"
				+ imgsrc + "'></img>" + "</td><td><h3>Buscar usuário</h3></td></tr></table></body></html>");
		lbHeader.setBorder(new LineBorder(Color.lightGray, 0, 0, 1, 0, 0, 8, 8, 8));
		lbHeader.setBackground(new Color(0xdddddd));
		lbHeader.setOpaque(true);

		JPanel paneilPesquisa = new JPanel();
		DesignGridLayout designGridLayout = new DesignGridLayout(paneilPesquisa);
		designGridLayout.row().grid().add(lbHeader);
		designGridLayout.row().grid(new JLabel("Nome/Tag/Tweet")).add(getCampoPesquisa());
		designGridLayout.row().grid(new JLabel("Montar Quantidades Perfis:")).add(getFiltrarPesquisa());
		designGridLayout.row().center().add(getPesquisarButton());

		subPanelHeader.add(paneilPesquisa);

		add(paneilPesquisa, BorderLayout.NORTH);
		popularLista();
		scrollPane = new JScrollPane(lista);
		scrollPane.setBorder(BorderFactory.createEmptyBorder());
		add(scrollPane, BorderLayout.CENTER);
		add(getAcoesPainel(), BorderLayout.SOUTH);
	}

	public void popularLista() {
		lista = new Table<Perfil>();
		lista.setCells(Perfil.class, new Cell("id"), new Cell("nomePerfil").setColor(new Color(0x4a77ce)), new Cell(
				"nomeExibicao").setColor(new Color(0x4a77ce)), new Cell("ultimoPost").setColor(new Color(0x4a77ce)),
				new Cell("destinoNome"));
		lista.addListListener(this);
	}

	public void updateLista(List<Perfil> perfis) {
		popularLista();
		this.remove(scrollPane);
		for (Perfil perfilDTO : perfis) {
			lista.addItem(perfilDTO);
		}
		scrollPane = new JScrollPane(lista);
		scrollPane.setBorder(BorderFactory.createEmptyBorder());
		add(scrollPane, BorderLayout.CENTER);
		this.revalidate();
	}

	public void limparLista() {
		lista.setModel(null);
		lista.repaint();
		this.revalidate();
	}

	public JPanel getAcoesPainel() {
		if (acoesPanel == null) {
			acoesPanel = new JPanel();
			DesignGridLayout designGridLayout = new DesignGridLayout(acoesPanel);
			designGridLayout.row().center().add(getSalvarUsuarioButton()).add(getSalvarRelacoesButton()).add(
					getLimparPesquisaButton());
		}
		return acoesPanel;
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub

	}

	public JScrollPane getScrollPane() {
		if (scrollPane == null) {
			scrollPane = new JScrollPane();
		}
		return scrollPane;
	}

	public ToolFooter getSubPanelHeader() {
		if (subPanelHeader == null) {
			subPanelHeader = new ToolFooter();
		}

		return subPanelHeader;
	}

	public JTextField getCampoPesquisa() {
		if (campoPesquisa == null) {
			campoPesquisa = new JTextField(10);
		}

		return campoPesquisa;
	}

	public JButton getSalvarRelacoesButton() {
		if (salvarRelacoesButton == null) {
			salvarRelacoesButton = new JButton();
			salvarRelacoesButton.setText("Salvar Relações");
			salvarRelacoesButton.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent arg0) {
					if (usuariosPesquisados != null && !usuariosPesquisados.isEmpty()) {
						List<Relacionamento> relacoesDTOs = new ArrayList<Relacionamento>(0);
						if (verificarRelacoes()) {
							for (Tweet tweet : recuperarListaTweetFiltrada()) {
								if (tweet.getText().contains("RT")) {
									try {
										Relacionamento relacoesDTO = new Relacionamento();
										String nome = StringUtil.retornarNomePrincipal(tweet.getText(), "@");
										User userDestino = TwitterBean.obterUsuarioPeloNome(nome);
										relacoesDTO.setIdOrigem(tweet.getFromUserId());
										relacoesDTO.setNomeOrigem(tweet.getFromUser());
										relacoesDTO.setIdDestino(userDestino.getId());
										relacoesDTO.setNomeDestino(userDestino.getScreenName());
										relacoesDTO.setTweetRelacao(tweet.getText());
										relacoesDTO.setHashTagPesquisa(campoPesquisa.getText());
										relacoesDTOs.add(relacoesDTO);
									} catch (TwitterException e) {
										// TODO Auto-generated catch block
										e.printStackTrace();
									}
								}
							}
							perfilDAO.inserirRelacoes(relacoesDTOs);
							mostrarMensagem("Relações salvas com sucesso!");
						}
					} else {
						mostrarMensagem("Para executar esta ação é necessário efetuar uma pesquisa antes!");
					}
				}

				private List<Tweet> recuperarListaTweetFiltrada() {
					List<Tweet> relacoesTweet = new ArrayList<Tweet>();
					int contador = 0;
					for (Tweet t : usuariosPesquisados) {
						if (contador <= (Integer)getFiltrarPesquisa().getSelectedItem()) {
							relacoesTweet.add(t);
							contador++;
						}
					}
					return relacoesTweet;
				}
			});
		}
		return salvarRelacoesButton;
	}

	public boolean verificarRelacoes() {
		if (perfilDTOs != null && !perfilDTOs.isEmpty()) {
			int contador = 0;
			for (Perfil perfil : perfilDTOs) {
				if (perfil.getUltimoPost().contains("RT")) {
					contador++;
				}
			}
			if (confirmarExecucao("Nesta consulta existe >> " + contador + " relações . Deseja salvar as relações?",
					"Alerta") == JOptionPane.YES_OPTION) {
				return true;
			}
			return false;
		}
		return false;
	}

	public JButton getPesquisarButton() {
		if (pesquisarButton == null) {
			pesquisarButton = new JButton();
			pesquisarButton.setText("Pesquisar Usuário");
			pesquisarButton.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent arg0) {
					if (campoPesquisa.getText() != null && !campoPesquisa.getText().equals("")) {
						try {
							usuariosPesquisados = TwitterBean.getTweetsPorStatusOrRT(campoPesquisa.getText(),
									(Integer) getFiltrarPesquisa().getSelectedItem());
							Map<String, String> usuario = new HashMap<String, String>();
							for (Tweet tweet : usuariosPesquisados) {
								usuario.put(tweet.getFromUser(), tweet.getText());
							}
							if (usuariosPesquisados.isEmpty()) {
								mostrarMensagem("Nenhum registro encontrado.");
							} else {
								mostrarMensagem("Resultados Obtidos:" + usuariosPesquisados.size());
								perfilDTOs = new ArrayList<Perfil>(0);
								int contador = 0;
								for (String chave : usuario.keySet()) {
									Integer conut = (Integer) getFiltrarPesquisa().getSelectedItem();
									if (contador <= conut) {
										perfilDTOs.add(TwitterBean.montarPerfilDTO(TwitterBean
												.obterUsuarioPeloNome(chave), usuario.get(chave)));
										System.out.println("Adicionando registro >> " + contador++);
									} else {
										break;
									}
								}
								updateLista(perfilDTOs);
							}
						} catch (TwitterException e) {
							String message = e.getMessage();
							if (message.length() > 200) {
								mostrarMensagem("Erro na integração: Timeout ... ");
							} else {
								mostrarMensagemInformativa(e.getMessage(), "Erro");
							}
						} finally {
							updateLista(perfilDTOs);
						}
					} else {
						mostrarMensagem("Campo obrigatório nome não preenchido.");
					}
				}
			});
		}
		return pesquisarButton;
	}

	public JButton getLimparPesquisaButton() {
		if (limparPesquisaButton == null) {
			limparPesquisaButton = new JButton();
			limparPesquisaButton.setText("Limpar");
			limparPesquisaButton.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent arg0) {
					getCampoPesquisa().setText(null);
					updateLista(new ArrayList<Perfil>(0));
				}
			});
		}
		return limparPesquisaButton;
	}

	public JButton getSalvarUsuarioButton() {
		if (salvarUsuarioButton == null) {
			salvarUsuarioButton = new JButton();
			salvarUsuarioButton.setText("Salvar Usuários");
			salvarUsuarioButton.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent e) {
					if (perfilDTOs != null && !perfilDTOs.isEmpty()) {
						TwitterDAO dao = new TwitterDAO();
						dao.inserirPerfis(perfilDTOs);
						JOptionPane.showMessageDialog(null, "Perfis salvos com sucesso!");
						popularLista();
					} else {
						JOptionPane.showMessageDialog(null, "Para salvar perfis e necessário efetuar uma pesquisa.");
					}
				}
			});
		}
		return salvarUsuarioButton;
	}

	@Override
	public void selectionChanged(ListSelectionEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void doubleClicked(Perfil arg0) {
		String montarDetalhamento = montarDetalhamento(arg0);
		JLabel lbHeader = new JLabel(montarDetalhamento);
		lbHeader.setBorder(new LineBorder(Color.lightGray, 0, 0, 1, 0, 0, 8, 8, 8));
		lbHeader.setBackground(new Color(0xdddddd));
		lbHeader.setOpaque(true);
		JOptionPane.showMessageDialog(null, lbHeader, "Detalhamento de Usuário", JOptionPane.PLAIN_MESSAGE, null);

	}

	public JComboBox getFiltrarPesquisa() {
		if (filtrarPesquisa == null) {
			filtrarPesquisa = new JComboBox();
			filtrarPesquisa.addItem(new Integer(5));
			filtrarPesquisa.addItem(new Integer(10));
			filtrarPesquisa.addItem(new Integer(20));
			filtrarPesquisa.addItem(new Integer(50));
			filtrarPesquisa.addItem(new Integer(100));
			filtrarPesquisa.addItem(new Integer(150));
			filtrarPesquisa.addItem(new Integer(200));
			filtrarPesquisa.addItem(new Integer(250));
			filtrarPesquisa.setSelectedIndex(0);
		}
		return filtrarPesquisa;
	}
}
